#ifndef INI_WRAPPER_H
#define INI_WRAPPER_H

#include <stdint.h>

//ini 文件中 section 名称的长度
#define SECTION_NAME_SIZE   (32)
//ini 文件中，配置项名称的长度
#define MEMBER_NAME_SIZE   (32)
//ini 文件中，配置项的值为字符串时，字符串的最大长度
// #define STRING_BUF_SIZE (64)
#define STRING_BUF_SIZE (128)
//ini 文件名称长度
#define INI_FILENAME_LEN    (64)

//ini 文件中，配置项的值类型
enum value_type {
    TYPE_BOOL,
    TYPE_INT,
    TYPE_LONG,
    TYPE_STRING,
    TYPE_DOUBLE,
};

//[section] 中的成员信息
struct member_info {
    int8_t name[MEMBER_NAME_SIZE];      //成员名称
    enum value_type type;               //成员值类型
    union {
        int8_t i8;                      //bool
        int32_t i32;                    //int32
        int64_t i64;                    //int64
        int8_t s[STRING_BUF_SIZE];      //string
        double d64;                     //double
    }v;
};

//配置文件中的 各个[section] 信息
//使用 uint64_t 存储成员数量，是为了保持结构体对齐
struct section_baseinfo {
    int8_t name[SECTION_NAME_SIZE];     //section 名称
    uint64_t member_num;                //成员数量
};

//配置文件中的 section 个数
//使用 uint64_t 存储成员数量，是为了保持结构体对齐
struct ini_info {
    char filename[256];
    uint64_t section_num;
};

/*******************************程序中使用以下结构体作为配置*********************************/
/*定义业务结构体时，每个 section 需要继承该结构体。
  section 成员之后，应包含多个 struct member_info
*/
struct section_info {
    struct section_baseinfo base;
};

/*定义业务结构体时，整体的配置项结构体需要继承该结构体
  ex:
    struct network_info {
        struct section_info section;   //继承 struct section_info
        struct member_info ip;          //多个 struct member_info
        struct member_info port;
        struct member_info netmask;
        struct member_info gateway;
    };

    struct ini_net {
        struct ini_config ini;
        struct network_info net;
    };
                                        */
struct ini_config {
    struct ini_info ini;   //只解析固定数量的 section
    /*继承 struct section_info 的业务结构体*/
};

/**
 * 解析 ini 文件中的配置信息到结构体中
 *
 * @param config[in/out] 传入配置文件中的section名称，输出配置文件中各配置项到结构体
 * @param section_start section缓存区起始地址
 *
 * @return int32_t 0：解析成功；-1：解析失败
 *
 * @author sdc
 */
extern  int32_t inifile_config_parse(struct ini_config *config, struct section_info * section_start);

/**
 * 将配置信息存储到配置文件中
 *
 * @param config[in] 各配置项内容
 *
 * @return int32_t 0：配置存储成功；-1：配置存储失败
 *
 * @author sdc
 */
extern int32_t inifile_config_save(struct ini_config *config, struct section_info * section_start);

/**
 * @brief 拷贝配置文件
 * 
 * @param src_config ：源文件
 * @param dest_config ：目标文件
 * 
 * @return int32_t ：返回结果，0：正常，非0：错误代码
 * 
 * @note：
 */
extern int32_t inifile_config_copy(struct ini_config * src_config, struct ini_config * dest_config);

#endif


